module nazo.env;
/**
 * 環境変数
 * History:
 *          0.0.0.2 vphobosからマージ
 *                  テンプレートバージョン追加
 *          0.0.0.1 バージョン付け開始
 * Authors: Nazo, Yume Kondou
 * Version: 0.0.0.2
 * License: Public Domain
 */
import std.string, std.stdio, nazo.string, std.c.string;

extern(C){
  char* getenv(const(char)* name);
  version(Windows){
    int putenv(const(char)* envstring);
  }else{
    int setenv(const(char)* name,const(char)* value);
    int unsetenv(const(char)* name);
  }
  extern char** environ;
}

///現在のプロセスの環境変数に関するクラス
class Env{
  ///環境変数一覧を取得します。
  static string[string] getList(){
    string[string] rv;
    char** ep=environ;
    for(;*ep;ep++){
        string tmp2=.toString(*ep);
        int tmp=tmp2.find('=');
        rv[tmp2[0..tmp]]=tmp2[tmp+1..$];
    }
    return rv;
  }
  ///環境変数を取得します。
  static string get(string name){
    return .toString(getenv(.toStringz(name)));
  }
  static string TGet(string name)(){
/*    enum s=name~'\0';
    return .toString(getenv(s.ptr));
*/
    enum s=name~'=';
    char** ep=environ;
    for(;*ep;ep++){
      if(**ep != s[0])continue;
      size_t len = strlen(*ep);
      if(len >= s.length && (*ep)[0..s.length] == s)
        return ((*ep)[s.length..len]).idup;
    }
    return null;
  }
  ///環境変数を設定します。
  static int set(string name,string value){
    version(Windows){
      return putenv(.toStringz(name~"="~value));
    }else{
      return setenv(.toStringz(name),.toStringz(value));
    }
  }
  static string TSet(string name)(string value){
    version(Windows){
      enum s=name~'=';
      return putenv(.toStringz(s~value));
    }else{
      enum s=name~'\0';
      return setenv(s,.toStringz(value));
    }
  }
  ///環境変数を削除します。
  static int unset(string name){
    version(Windows){
      return putenv(.toStringz(name~'='));
    }else{
      return unsetenv(.toStringz(name));
    }
  }
  static int TUnset(string name)(){
    version(Windows){
      enum s=name~"=\0";
      return putenv(s);
    }else{
      enum s=name~'\0';
      return unsetenv(s);
    }
  }
}
